package com.prolambda.model;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class EncrypAES {

	/** 
     * 加密 
    *  
     * @param content 需要加密的内容 
    * @param password  加密密码 
    * @return 
     */   
    public static byte[] encrypt(String content, String password) {   
            try {              
                    //KeyGenerator kgen = KeyGenerator.getInstance("AES");   
                    //kgen.init(128, new SecureRandom(password.getBytes()));   
                    //SecretKey secretKey = kgen.generateKey();   
                    //byte[] enCodeFormat = secretKey.getEncoded();  
            		Security.addProvider(new com.sun.crypto.provider.SunJCE());
            		int len = password.length();
            		for(int i=0;i<16-len;i++){
            			password+="9";
            		}
            		byte[] arrBTmp=null;
            		try {
            			arrBTmp = password.getBytes("GBK");
            		} catch (UnsupportedEncodingException e1) {
            			// TODO Auto-generated catch block
            			e1.printStackTrace();
            		}
            		
            		byte[] arrB = new byte[16];

            	
            		for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            			arrB[i] = arrBTmp[i];
            		}
                    SecretKeySpec key = new SecretKeySpec(arrB, "AES");   
                    Cipher cipher = Cipher.getInstance("AES");// 创建密码器   
                    byte[] byteContent = content.getBytes("GBK");   
                    cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化   
                    byte[] result = cipher.doFinal(byteContent);   
                    return result; // 加密   
            } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();   
            } catch (NoSuchPaddingException e) {   
                    e.printStackTrace();   
            } catch (InvalidKeyException e) {   
                    e.printStackTrace();   
            } catch (UnsupportedEncodingException e) {   
                    e.printStackTrace();   
            } catch (IllegalBlockSizeException e) {   
                    e.printStackTrace();   
            } catch (BadPaddingException e) {   
                    e.printStackTrace();   
            }   
            return null;   
    }   
    
    public static String AESencrypt(String content,String password){
    	
    	return parseByte2HexStr(encrypt(content,password));
    }
      
    /**解密 
     * @param content  待解密内容 
     * @param password 解密密钥 
     * @return 
      */   
     public static byte[] decrypt(byte[] content, String password) {   
             try {   
                      KeyGenerator kgen = KeyGenerator.getInstance("AES");   
                      kgen.init(128, new SecureRandom(password.getBytes()));   
                      SecretKey secretKey = kgen.generateKey();   
                      byte[] enCodeFormat = secretKey.getEncoded();   
                      SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");               
                      Cipher cipher = Cipher.getInstance("AES");// 创建密码器   
                     cipher.init(Cipher.DECRYPT_MODE, key);// 初始化   
                     byte[] result = cipher.doFinal(content);   
                     return result; // 加密   
             } catch (NoSuchAlgorithmException e) {   
                     e.printStackTrace();   
             } catch (NoSuchPaddingException e) {   
                     e.printStackTrace();   
             } catch (InvalidKeyException e) {   
                     e.printStackTrace();   
             } catch (IllegalBlockSizeException e) {   
                     e.printStackTrace();   
             } catch (BadPaddingException e) {   
                     e.printStackTrace();   
             }   
             return null;   
     }  
       
     public static String AESdecrypt(String content,String password){
    	 byte[] decryptFrom = parseHexStr2Byte(content);
    	 return new String(decrypt(decryptFrom,password));
     }
       
     /**将二进制转换成16进制 
      * @param buf 
       * @return 
       */   
      public static String parseByte2HexStr(byte buf[]) {   
              StringBuffer sb = new StringBuffer();   
              for (int i = 0; i < buf.length; i++) {   
                      String hex = Integer.toHexString(buf[i] & 0xFF);   
                      if (hex.length() == 1) {   
                              hex = '0' + hex;   
                      }   
                      sb.append(hex.toUpperCase());   
              }   
              return sb.toString();   
      }   
        
      /**将16进制转换为二进制 
       * @param hexStr 
        * @return 
        */   
       public static byte[] parseHexStr2Byte(String hexStr) {   
               if (hexStr.length() < 1)   
                       return null;   
               byte[] result = new byte[hexStr.length()/2];   
               for (int i = 0;i< hexStr.length()/2; i++) {   
                       int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);   
                       int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);   
                       result[i] = (byte) (high * 16 + low);   
               }   
               return result;   
       }   
         
      
}
